package com.example.administrator.music;

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Environment;
import android.util.Log;

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class MusicService {

    public static final String PATH = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).toString();// 获取SD卡总目录。
    public List<String> musicList;// 存放找到的所有mp3的绝对路径。
    public MediaPlayer player; // 定义多媒体对象
    public int mSongNum; // 当前播放的歌曲在List中的下标,flag为标致
    public String songName; // 当前播放的歌曲名

    int mPlayMode;  //控制播放方式，值同MainActivity

    class MusicFilter implements FilenameFilter {
        public boolean accept(File dir, String name) {
            return (name.endsWith(".mp3"));//返回当前目录所有以.mp3结尾的文件
        }
    }

    public MusicService() {
        super();
        mPlayMode = 0;  //播放方式默认为顺序播放
        player = new MediaPlayer();
        musicList = new ArrayList<String>();
        try {
            File MUSIC_PATH = new File(PATH);//获取Music文件的二级目录
            //如果当前文件夹不存在，则进行创建当前文件夹
            if (!MUSIC_PATH.exists()) {
                MUSIC_PATH.mkdirs();
            }

            if (MUSIC_PATH.exists()) {
                File[] files = MUSIC_PATH.listFiles(new MusicFilter());
                if (files == null) {
                    Log.i("TAG", "数据为空");
                    return;
                }
                int length = files.length;
                if (length > 0) {
                    for (File file : MUSIC_PATH.listFiles(new MusicFilter())) {
                        musicList.add(file.getAbsolutePath());
                    }
                }
            }
        } catch (Exception e) {
            Log.i("TAG", String.format("[ERROR] 读取文件异常%s", e.getMessage()));
        }

    }

    /**
     * 获取一个文件夹下的所有文件全路径
     */
/*    public static void getAllFileName(String path, ArrayList<String> listFileName) {
        File file = new File(path);
        File[] files = file.listFiles();
        String[] names = file.list();
        if (names != null) {
            String[] completNames = new String[names.length];
            for (int i = 0; i < names.length; i++) {
                completNames[i] = path + names[i];
            }
            listFileName.addAll(Arrays.asList(completNames));
        }
        for (File a : files) {
            if (a.isDirectory()) {//如果文件夹下有子文件夹，获取子文件夹下的所有文件全路径。
                getAllFileName(a.getAbsolutePath() + "\\", listFileName);
            }
        }
    }*/

    //修改文件名
    public void setPlayName(String dataSource) {
        File file = new File(dataSource);
        String name = file.getName();
        int index = name.lastIndexOf(".");//找到最后一个.
        songName = name.substring(0, index);//将文件的源格式截取并最终转换成去掉路径和文件类型后缀的文件
    }


    public void play() {
        try {
            player.reset(); //重置多媒体
            String dataSource = musicList.get(mSongNum);//得到当前播放音乐的路径
            setPlayName(dataSource);//截取歌名
            // 指定参数为音频文件
            player.setAudioStreamType(AudioManager.STREAM_MUSIC);
            player.setDataSource(dataSource);//为多媒体对象设置播放路径
            player.prepare();//准备播放
            player.start();//开始播放

            //setOnCompletionListener 当当前多媒体对象播放完成时发生的事件
            player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                public void onCompletion(MediaPlayer arg0) {
                    next(mPlayMode);    //播放完成时，根据当前播放模式确定下一首该播放什么

                }
            });

        } catch (Exception e) {
            Log.v("MusicService", e.getMessage());
        }
    }

    //继续播放
    public void goPlay() {
        int position = getCurrentProgress();
        player.seekTo(position);//设置当前MediaPlayer的播放位置，单位是毫秒。
        try {
            player.prepare();//  同步的方式装载流媒体文件。
        } catch (Exception e) {
            e.printStackTrace();
        }
        player.start();
    }

    // 获取当前进度
    public int getCurrentProgress() {
        if (player != null & player.isPlaying()) {
            return player.getCurrentPosition();
        } else if (player != null & (!player.isPlaying())) {
            return player.getCurrentPosition();
        }
        return 0;
    }

    public void next() {
        mSongNum = mSongNum == musicList.size() - 1 ? 0 : mSongNum + 1;
        play();
    }

    //带参数的下一首，用以判断播放方式
    public void next(int playMode){
        mPlayMode = playMode;
        switch (playMode){
            case 0:
                //顺序播放
                next();
                break;
            case 1:
                //随机播放
                Random random = new Random();
                mSongNum = random.nextInt(musicList.size());  //生成范围内的随机整数
                play();
                break;
            case 2:
                //单曲循环
                play();     //单曲循环模式下，下一首还是该曲，再次调用播放方法即可
                break;
        }

    }

    public void last() {
        mSongNum = mSongNum == 0 ? musicList.size() - 1 : mSongNum - 1;
        play();
    }

    // 暂停播放
    public void pause() {
        if (player != null && player.isPlaying()) {
            player.pause();
        }
    }

    public void stop() {
        if (player != null && player.isPlaying()) {
            player.stop();
            player.reset();
        }
    }


}


